//给你一个含重复值的二叉搜索树（BST）的根节点 root ，找出并返回 BST 中的所有 众数（即，出现频率最高的元素）。 
//
// 如果树中有不止一个众数，可以按 任意顺序 返回。 
//
// 假定 BST 满足如下定义： 
//
// 
// 结点左子树中所含节点的值 小于等于 当前节点的值 
// 结点右子树中所含节点的值 大于等于 当前节点的值 
// 左子树和右子树都是二叉搜索树 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：root = [1,null,2,2]
//输出：[2]
// 
//
// 示例 2： 
//
// 
//输入：root = [0]
//输出：[0]
// 
//
// 
//
// 提示： 
//
// 
// 树中节点的数目在范围 [1, 10⁴] 内 
// -10⁵ <= Node.val <= 10⁵ 
// 
//
// 
//
// 进阶：你可以不使用额外的空间吗？（假设由递归产生的隐式调用栈的开销不被计算在内） 
// Related Topics 树 深度优先搜索 二叉搜索树 二叉树 👍 453 👎 0

package leetcode.editor.cn;
//leetcode submit region begin(Prohibit modification and deletion)

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution501 {
    //迭代法
    public int[] findMode(TreeNode root) {
        int count = 0;
        int maxCount = 0;
        TreeNode pre = null;
        Deque<TreeNode> stack = new LinkedList<>();
        while (root != null || !stack.isEmpty()) {
            if(root != null){
                stack.push(root);
                root = root.left;
            } else {
                root = stack.pop();
                if (pre == null) {
                    count = 1;
                } else if (pre.val == root.val) {
                    count++;
                } else {
                    count = 1;
                }
                pre = root;
                if (count == maxCount) {
                    list.add(root.val);
                }
                if (count > maxCount) {
                    maxCount = count;
                    list.clear();
                    list.add(root.val);
                }
                root = root.right;
            }
        }
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
    //递归法
    int count = 0; //用于计算重复的次数
    int maxCount = 0; //用于保存最大重复次数
    TreeNode pre = null; //用来保存前一个节点
    List<Integer> list =  new ArrayList<>();
    public int[] findMode2(TreeNode root) {
        searchBST(root);
        int[] arr = new int[list.size()];
        for(int i = 0; i < list.size(); i++){
            arr[i] = list.get(i);
        }
        return arr;
    }

    public void searchBST(TreeNode root){
        if(root == null) return ;
        searchBST(root.left);
        if(pre == null) { //第一个节点
            count = 1;
        } else if (root.val == pre.val) {
            count++;
        } else { //与前一个节点数值不相同，重新计数
            count = 1;
        }
        pre = root;
        if(count == maxCount){
            list.add(root.val);
        }
        if (count > maxCount) {
            maxCount = count;
            list.clear();
            list.add(root.val);
        }
        searchBST(root.right);
    }
}
//leetcode submit region end(Prohibit modification and deletion)
